// ✨✨✨创建全局Token操作类

// 具体实现步骤:
// 1. 创建Token管理类(TokenManager)
// 2. 定义私有属性(_token)和常量(_key)
// 3. 创建一个全局单例对象
//   a. 使用 _instance 变量来存储类的唯一实例
//   b. 通过私有构造函数 TokenManager._internal() 确保外部不能直接创建实例
//   c. factory TokenManager() 工厂方法用于检查 _instance 是否已初始化, 若未初始化则创建实例并赋值，最后返回 _instance!
// 4. 提供init方法用于从本地获取token
// 5. 提供saveToken方法用于存储token
// 6. 提供getToken方法用于同步获取token
// 7. 提供removeToken方法用于删除token


// 提供对token的存储、获取和删除操作 ，localstorage

import 'package:shared_preferences/shared_preferences.dart';

/// Token管理类，用于保存、获取和移除Token
/// 使用Singleton模式确保全局只有一个实例
class TokenManager {
  // Token变量，存储当前的Token值
  String? _token;
  // Token在SharedPreferences中的键值
  final _key = 'enjoy_token';

  // Singleton模式的实例变量
  // 声明了一个静态的、可空的 TokenManager 类型变量 _inst ，这是单例模式中用于保存唯一实例的变量 。
  static TokenManager? _instance;
  // 私有构造函数，防止外部实例化
  // 私有的命名构造函数 _internal ，外部无法直接调用，用于在类内部创建实例，是实现单例模式防止外部随意实例化的关键部分 。
  TokenManager._internal();

  /// Singleton模式的工厂构造函数
  /// 确保返回唯一的实例
  factory TokenManager() {
    // 如果变量的当前值为 null，则将右侧的值赋给它；否则，保持变量的原值不变。
    _instance ??= TokenManager._internal();
    return _instance!;
  }

  /// 初始化方法，从SharedPreferences中获取Token
  Future<void> init() async {
    final prefs = await SharedPreferences.getInstance();
    _token = prefs.getString(_key);
  }

  /// 保存Token到SharedPreferences中
  ///
  /// @param token 要保存的Token字符串
  Future<void> saveToken(String token) async {
    _token = token;
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString(_key, token);
  }

  /// 获取当前的Token值
  ///
  /// @return 当前的Token字符串，如果没有Token则返回null
  String? getToken() {
    return _token;
  }

  /// 移除SharedPreferences中的Token
  Future<void> removeToken() async {
    _token = null;
    final prefs = await SharedPreferences.getInstance();
    await prefs.remove(_key);
  }
}